package com.efounder.tbs;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.text.TextUtils;

import androidx.annotation.NonNull;

import com.efounder.constant.EnvironmentVariable;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.smtt.sdk.QbSdk;
import com.tencent.smtt.sdk.TbsVideo;
import com.utilcode.util.FileUtils;
import com.utilcode.util.SPUtils;

/**
 * 使用tbs 展示文档
 *
 * @autor yqs
 * @date 2018/12/13 14:47
 **/
public class DisplayFileWithTbsUtil {


    /**
     * 展示文档
     *
     * @param filePath 文件路径
     */
    @Deprecated
    public static boolean displayFile(Context mcontext, String filePath) {
        return previewLocalFile(mcontext, filePath);
    }


    /**
     * 是否支持tbs
     *
     * @return
     */
    public static boolean supportTbs() {
        if (EnvironmentVariable.getProperty("initTbs", "0").equals("0")) {
            return false;
        }
//        if (EnvironmentVariable.getProperty("tbsLoadResult", "").equals("false")) {
        if (SPUtils.getInstance("EnvironmentVariable").getString("tbsLoadResult", "").equals("false")) {
            //tbs内核没有加载成功，相当于不支持
            //向bugly报告不支持tbs
            CrashReport.postCatchedException(new TbsNotSupportThrowable("该用户设备不支持tbs"));
            return false;
        }
        return true;
    }

    /**
     * 文件预览
     *
     * @param mcontext      上下文
     * @param localFilePath 文件本地路径
     * @return 是否支持此文件格式
     */
    public static boolean previewLocalFile(Context mcontext, String localFilePath) {
        try {
            if (!supportTbs()) {
                //tbs内核没有加载成功，那就不使用了
                return false;
            }
            String fileType = FileUtils.getFileExtension(localFilePath);
            if (TextUtils.isEmpty(fileType)) {
                return false;
            }
            if (isDocument(localFilePath)) {
                //调用腾讯浏览服务
                FileDisplayActivity.show(mcontext, localFilePath);
                return true;
            } else if (isVideo(localFilePath)) {
                //调用腾讯视频浏览服务
                if (TbsVideo.canUseTbsPlayer(mcontext)) {
                    Bundle bundle = new Bundle();
                    //102来实现默认全屏+控制栏等UI
                    bundle.putString("screenMode", "101");
                    TbsVideo.openVideo(mcontext, localFilePath, bundle);
                    return true;
                }
            } else {
                /**
                 * ret 返回值
                 * 1：用 QQ 浏览器打开
                 * 2：用 MiniQB 打开
                 * 3：调起阅读器弹框
                 * -1：filePath 为空 打开失败
                 */
                //int ret = QbSdk.openFileReader(mcontext, localFilePath, null, null);

                //向bugly报告不支持tbs
//                CrashReport.postCatchedException(new TbsNotSupportThrowable("该用户设备不支持tbs"));

                //判断是否安装qq浏览器
                if (installedQQBrowser(mcontext)) {
                    int ret = QbSdk.openFileReader(mcontext, localFilePath, null, null);
                    if (ret == 1 || ret == 2) {
                        return true;
                    }
                }
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 文件预览
     *
     * @param mcontext
     * @param url      文件下载的url
     * @param fileName 文件名称（url可能获取不到文件后缀名，我们需要从文件名换获取，例如 abc.pdf）,不能温控
     * @return 是否支持打开
     */
    public static boolean previewFileByUrl(Context mcontext, String url, @NonNull String fileName) {
        try {
            if (!supportTbs()) {
                //tbs内核没有加载成功，那就不使用了
                return false;
            }

            if (isDocument(fileName)) {
                //调用腾讯浏览服务
                FileDisplayActivity.show(mcontext, url, fileName);
                return true;
            } else if (isVideo(fileName)) {
                //调用腾讯视频浏览服务
                if (TbsVideo.canUseTbsPlayer(mcontext)) {
                    TbsVideo.openVideo(mcontext, url);
                    return true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }


    /**
     * 通过文件名判断是否是视频
     *
     * @param filePathOrFileName
     * @return
     */
    public static boolean isVideo(String filePathOrFileName) {
        String fileType = FileUtils.getFileExtension(filePathOrFileName);
        if (TextUtils.isEmpty(fileType)) {
            return false;
        }
        if ("mp4".equals(fileType.toLowerCase())
                || "avi".equals(fileType.toLowerCase())
                || "rmvb".equals(fileType.toLowerCase())
                || "3gp".equals(fileType.toLowerCase())
                || "mpg".equals(fileType.toLowerCase())
                || "mpeg".equals(fileType.toLowerCase())) {
            return true;
        }
        return false;
    }

    /**
     * 是否是文档
     *
     * @param filePathOrFileName
     * @return
     */
    public static boolean isDocument(String filePathOrFileName) {
        String fileType = FileUtils.getFileExtension(filePathOrFileName);
        if (TextUtils.isEmpty(fileType)) {
            return false;
        }
        if (fileType.toLowerCase().equals("pdf")
                || fileType.toLowerCase().equals("txt")
                || fileType.toLowerCase().equals("epub")
                || fileType.toLowerCase().equals("docx")
                || fileType.toLowerCase().equals("doc")
                || fileType.toLowerCase().equals("xls")
                || fileType.toLowerCase().equals("xlsx")
                || fileType.toLowerCase().equals("ppt")
                || fileType.toLowerCase().equals("pptx")) {
            return true;
        }
        return false;
    }

    /**
     * 判断是否安装qq浏览器
     *
     * @param context
     * @return
     */
    public static boolean installedQQBrowser(Context context) {
        PackageInfo packageInfo = null;
        try {
            packageInfo = context.getPackageManager().getPackageInfo("com.tencent.mtt", 0);
        } catch (PackageManager.NameNotFoundException e) {
        }
        if (packageInfo != null) {
            return true;
        }
        return false;
    }
    /**
     * 播放视频的调用接口
     *
     * 通过TbsVideo的静态方法，如下：
     *
     * public static boolean canUseTbsPlayer(Context context)
     *
     * //判断当前Tbs播放器是否已经可以使用。
     *
     * public static void openVideo(Context context, String videoUrl)
     *
     * //直接调用播放接口，传入视频流的url
     *
     * public static void openVideo(Context context, String videoUrl, Bundle extraData)
     *
     * //extraData对象是根据定制需要传入约定的信息，没有需要可以传如null
     *
     * //extraData可以传入key: "screenMode", 值: 102, 来控制默认的播放UI
     *
     * //类似: extraData.putInt("screenMode", 102); 来实现默认全屏+控制栏等UI
     */
}
